avoid panic when virtual workspace has no members
authorAndy Russell <arussell123@gmail.com>
Fri, 21 Oct 2016 03:57:51 +0000 (23:57 -0400)
committerAndy Russell <arussell123@gmail.com>
Thu, 8 Dec 2016 21:11:19 +0000 (16:11 -0500)
src/cargo/core/resolver/encode.rs
tests/workspaces.rs

index 47c20b89beaa08d52bdd75dbcafa57663ecafbfc..6640e53e3aaacc2a04e16dcee7b361bb1943d75e 100644 (file)
@@ -283,14 +283,15 @@ impl<'a, 'cfg> Encodable for WorkspaceResolve<'a, 'cfg> {
 
         let root = self.ws.members().max_by_key(|member| {
             member.name()
-        }).unwrap().package_id();
+        }).map(Package::package_id);
 
         let encodable = ids.iter().filter_map(|&id| {
-            if self.use_root_key && root == id {
-                return None
+            match root {
+                Some(ref root) if !(self.use_root_key && *root == id) => {
+                    Some(encodable_resolve_node(id, self.resolve))
+                },
+                _ => None,
             }
-
-            Some(encodable_resolve_node(id, self.resolve))
         }).collect::<Vec<_>>();
 
         let mut metadata = self.resolve.metadata.clone();
@@ -307,10 +308,9 @@ impl<'a, 'cfg> Encodable for WorkspaceResolve<'a, 'cfg> {
 
         let metadata = if metadata.len() == 0 {None} else {Some(metadata)};
 
-        let root = if self.use_root_key {
-            Some(encodable_resolve_node(&root, self.resolve))
-        } else {
-            None
+        let root = match root {
+            Some(root) if self.use_root_key => Some(encodable_resolve_node(&root, self.resolve)),
+            _ => None,
         };
         EncodableResolve {
             package: Some(encodable),
index 42ac608da464115b5134bf70ec607418bd3160f1..00bb68bd43dd7786d70de0f46aefd7ddcf42548c 100644 (file)
@@ -652,6 +652,29 @@ manifest located at: [..]
 
 #[test]
 fn virtual_build() {
+    let p = project("foo")
+        .file("Cargo.toml", r#"
+            [workspace]
+            members = ["bar"]
+        "#)
+        .file("bar/Cargo.toml", r#"
+            [project]
+            name = "bar"
+            version = "0.1.0"
+            authors = []
+        "#)
+        .file("bar/src/main.rs", "fn main() {}");
+    p.build();
+    assert_that(p.cargo("build"),
+                execs().with_status(101)
+                       .with_stderr("\
+error: manifest path `[..]` is a virtual manifest, but this command \
+requires running against an actual package in this workspace
+"));
+}
+
+#[test]
+fn virtual_build_no_members() {
     let p = project("foo")
         .file("Cargo.toml", r#"
             [workspace]